<?php
    /**
     * TCPPC Firewall
     * firewall.php
     * Date:2024/07/31
     * @version 2.3.02
     * @author 布丁小才 zyn_games_email@yeah.net
     */

    if (!php_sapi_name() === 'cli') {  
        echo '警告：请使用终端或命令提示符（cmd）运行此脚本';
        exit;
    }

    if (file_exists('data\tcppc.conf.json')) {
        $Config = json_decode(file_get_contents('data\tcppc.conf.json'),true);
    } else {
        $Config = array();
    }
    
	if (!is_array($Config)) {
		$Config = array();
	} 

    if (!isset($Config['is_auth2'])) {
        $Config['is_auth2'] = array();
    }

    class firewall {
        /**
         * 检查命令是否有敏感字符
         * @param string $data
         * @return bool
         */

        public function dos_shell(string $data) {
            $ToStart = 0;

            //按空格解刨
            $data2 = explode(" ",$data);

            //判断第一段参数是否为start或call
            if ($data2[0] == "start" or $data2[0] == "call") {
                $ToStart = 1;
            }

            //尝试修改注册表，拦截
            if ($data2[$ToStart] == "reg") {
                return false;
            }

            //尝试使用net执行用户级别操作，拦截
            if ($data2[$ToStart] == "net") {
                return false;
            }

            //尝试添加自启动，拦截
            if (
                (strpos(strtolower($data),"\「开始」菜单\程序\启动") !== false)
                or
                (strpos(strtolower($data),"\「开始」菜单\Programs\Startup") !== false)
                or
                (strpos(strtolower($data),"\「开始」菜单\程序\Startup") !== false)
                or
                (strpos(strtolower($data),"\「开始」菜单\Programs\启动") !== false)
                or
                (strpos(strtolower($data),"\Start Menu\程序\启动") !== false)
                or
                (strpos(strtolower($data),"\Start Menu\Programs\Startup") !== false)
                or
                (strpos(strtolower($data),"\Start Menu\程序\Startup") !== false)
                or
                (strpos(strtolower($data),"\Start Menu\Programs\启动") !== false)
            ) {
                return false;
            }

            //使用runas，拦截
            if ($data2[$ToStart] == "runas") {
                return false;
            }

            //使用netsh，拦截
            if ($data2[$ToStart] == "netsh") {
                return false;
            }

            //使用sc，拦截
            if ($data2[$ToStart] == "sc") {
                return false;
            }

            //整蛊代码拦截
            if (
                (strpos(strtolower($data),"start cmd && %0") !== false)
                or
                (strpos(strtolower($data),"%0|%0") !== false)
                or
                (strpos(strtolower($data),"cmd") !== false)
                or
                (strpos(strtolower($data),"%0") !== false)
            ) {
                return false;
            }

            //系统级进程操作拦截
            if (
                (strpos(strtolower($data),"system") !== false)
                or
                (strpos(strtolower($data),"csrss") !== false)
                or
                (strpos(strtolower($data),"userinit") !== false)
                or
                (strpos(strtolower($data),"wininit") !== false)
                or
                (strpos(strtolower($data),"smss") !== false)
                or
                (strpos(strtolower($data),"lsass") !== false)
                or
                (strpos(strtolower($data),"services") !== false)
                or
                (strpos(strtolower($data),"svchost") !== false)
                or
                (strpos(strtolower($data),"winlogon") !== false)
                or
                (strpos(strtolower($data),"explorer") !== false)
                or
                (strpos(strtolower($data),"hal.dll") !== false)
                or
                (strpos(strtolower($data),"ntoskrnl") !== false)
                or
                (strpos(strtolower($data),"sys") !== false)
                or
                (strpos(strtolower($data),"wscript") !== false)
                or
                (strpos(strtolower($data),"cscript") !== false)
            ) {
                return false;
            }

            //使用mshta，拦截
            if ($data2[$ToStart] == "mshta") {
                return false;
            }

            //若包含文件写入符，拦截
            if (strpos($data,">") !== false) {
                return false;
            }

            //若包含文件读取符，拦截
            if (strpos($data,"<") !== false) {
                return false;
            }

            //若使用del，拦截
            if ($data2[$ToStart] == "del") {
                return false;
            }

            if ($data2[$ToStart] == "erase") {
                return false;
            }

            //若使用powershell，拦截
            if ($data2[$ToStart] == "powershell") {
                return false;
            }

            global $Config;
            //用户自定义拦截
            foreach ($Config["is_auth2"] as $value) {
                if ($data2[$ToStart] == $value) {
                    return false;
                }
            }

            //若包含&或|，启动强力拦截
            if (strpos($data,"&") !== false or strpos($data,"|") !== false) {
                //使用mshta，拦截
                if (strpos(strtolower($data),"mshta") !== false) {
                    return false;
                }

                //使用del，拦截
                if (strpos(strtolower($data),"del") !== false) {
                    return false;
                }

                if (strpos(strtolower($data),"earse") !== false) {
                    return false;
                }

                //使用reg，拦截
                if (strpos(strtolower($data),"reg") !== false) {
                    return false;
                }

                //使用net，拦截
                if (strpos(strtolower($data),"net") !== false) {
                    return false;
                }

                //使用runas，拦截
                if (strpos(strtolower($data),"runas") !== false) {
                    return false;
                }

                //使用netsh，拦截
                if (strpos(strtolower($data),"netsh") !== false) {
                    return false;
                }

                //使用sc，拦截
                if (strpos(strtolower($data),"sc") !== false) {
                    return false;
                }

                //使用powershell，拦截
                if (strpos(strtolower($data),"powershell") !== false) {
                    return false;
                }

                //用户自定义拦截
                foreach ($Config["is_auth2"] as $value) {
                    if (strpos(strtolower($data),$value) !== false) {
                        return false;
                    }
                }
            }

            return true;
        }

        /**
         * 检测进程PID或进程名是否正常
         * @param string|int $data
         * @return bool
         */
        public function kill_task($data) {

            if (is_int($data)) {
                return true;
            }

            //系统级进程操作拦截
            if (
                (strpos(strtolower($data),"system") !== false)
                or
                (strpos(strtolower($data),"csrss.exe") !== false)
                or
                (strpos(strtolower($data),"userinit.exe") !== false)
                or
                (strpos(strtolower($data),"wininit.exe") !== false)
                or
                (strpos(strtolower($data),"smss.exe") !== false)
                or
                (strpos(strtolower($data),"lsass.exe") !== false)
                or
                (strpos(strtolower($data),"services.exe") !== false)
                or
                (strpos(strtolower($data),"svchost.exe") !== false)
                or
                (strpos(strtolower($data),"winlogon.exe") !== false)
                or
                (strpos(strtolower($data),"explorer.exe") !== false)
                or
                (strpos(strtolower($data),"ntoskrnl.exe") !== false)
            ) {
                return false;
            }

            global $Config;
            foreach ($Config["is_auth2"] as $value) {
                if (strpos(strtolower($data),$value) !== false) {
                    return false;
                }
            }

            //如果包含&或|，则直接拦截
            if (strpos($data,"&") !== false or strpos($data,"|") !== false) {
                return false;
            }

            return true;
        }
    }